package file_tab

import (
	"sort"

	"file_explorer/common/log"
	"file_explorer/model"
	"file_explorer/service"
	"file_explorer/service/eventbus"
	"file_explorer/view/components/main_panel/fe_tab"
	"file_explorer/view/packed_widgets"
	"file_explorer/view/store"

	"fyne.io/fyne/v2/container"
)

type FileTab struct {
	fe_tab.DefaultTab

	ToolBar   *Toolbar
	PathBar   *PathBar
	FileList  *FileList
	StatusBar *StatusBar

	tabCtx *store.FileTabContext
}

func (tab *FileTab) cleanMetaFileNum() {
	// 配置数量<=0时不处理
	if tab.tabCtx.GetGlobalConf().MetaFileNum <= 0 {
		return
	}

	// 获取当前目录元文件数量
	metaFiles := service.GetMetaFiles(tab.tabCtx.GetPath())

	// 数量不足，不处理
	if len(metaFiles) <= tab.tabCtx.GetGlobalConf().MetaFileNum {
		return
	}

	// 按文件名排序
	sort.Slice(metaFiles, func(i, j int) bool {
		return metaFiles[i].Name < metaFiles[j].Name
	})

	// 数量超过配置最大数量时，删除最早的元文件
	endIndex := len(metaFiles) - tab.tabCtx.GetGlobalConf().MetaFileNum
	err := service.DeleteFile(metaFiles[:endIndex])
	if err != nil {
		packed_widgets.NotifyError("清理元文件失败，路径：%s，错误：%s", tab.tabCtx.GetPath(), err.Error())
		return
	}

	packed_widgets.NotifyInfo("清理元文件成功，%d个元文件被删除，路径：%s", endIndex, tab.tabCtx.GetPath())
}

func NewFileTab(tabCtx store.TabContext, tabRefresh func()) (tab *FileTab, err error) {
	tab = &FileTab{
		tabCtx: tabCtx.(*store.FileTabContext),
	}

	/* 创建子组件 */
	// 文件列表
	tab.FileList = NewFileList(tab.tabCtx)
	// 工具栏
	tab.ToolBar = NewToolbar(tab.tabCtx, tab)
	// 地址栏
	tab.PathBar = NewPathBar(tab.tabCtx)
	// 状态栏
	tab.StatusBar = NewStatusBar(tab.tabCtx)

	/* 监听context目录更新时，刷新组件 */
	// 目录改变时，刷新地址栏、文件列表、状态栏
	tab.tabCtx.RegisterConsumer(eventbus.EventKeyFileTabPathChange, func(event *model.Event) {
		oldPath := eventbus.GetEventMsg[string](event, "old_path")
		newPath := eventbus.GetEventMsg[string](event, "new_path")

		if newPath != oldPath {
			log.Info("目录跳转，路径：%s", newPath)
		} else {
			log.Info("目录刷新，路径：%s", newPath)
		}

		// 目录跳转时，关闭过滤器窗口
		if oldPath != newPath && tab.ToolBar.filterWindow != nil {
			tab.ToolBar.filterWindow.Reset()
		}

		// 刷新视图
		tab.PathBar.RefreshData()
		tab.FileList.Reset()
		tab.ToolBar.RefreshData()
		tab.StatusBar.RefreshData()

		// 检查元文件数量，超过配置最大数量时自动删除
		tab.cleanMetaFileNum()

		tabRefresh() // 刷新tab标题，mainPanel整个传入太重了，也没其他比较合适的办法，就传个方法了
	})

	tab.tabCtx.RefreshPath()

	// 文件列表选中状态更新时，刷新状态栏、工具栏
	tab.FileList.Checklist.RegisterConsumer(eventbus.EventKeyWidgetChecklistChange, func(event *model.Event) {
		tab.StatusBar.RefreshData()
		tab.ToolBar.RefreshData()
	})

	top := container.NewVBox(tab.ToolBar.Container, tab.PathBar.Table)
	tab.Container = container.NewBorder(top, tab.StatusBar.Scroll, nil, nil, tab.FileList.Table)

	return tab, nil
}
